package methods;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;

/**
 * 需要实现的功能：
 * (类似在Windows控制台使用cd、mkdir等指令操作文件和文件夹)
 * 1.	进入指定目录下 ，输入 cd [绝对路径或相对于当前文件夹的相对路径]，进入目标文件夹下（可以用一个string成员变量来确定当前在哪个文件夹下，
 *      每进入下一个文件夹或者返回上一级就更新该变量）
 * 2.	返回上一级文件夹，输入 cd ..  ,返回上一级目录
 * 3.	新建文件, 输入 touch [文件名]， 在当前目录下创建文件
 * 4.	删除文件， 输入 delete [文件名], 删除该目录下此文件
 * 5.	新建文件夹 输入 mkdir [文件夹名称], 在当前文件夹下创建文件夹
 * 6.	移动指定文件或文件夹到指定文件夹下，输入 mv [当前文件夹下的文件夹或文件的名称] [目标路径]，把文件夹或者文件移动到目标路径下
 * 7.	获取当前文件夹下的所有文件和文件夹， 输入ls , 获取当前目录下的所有文件（包括文件夹）
 * 8.	查看文件内容， 输入 cat [文件名], 查看该目录下此文件的内容。
 * 9.	用键盘向指定文件里写入数据（可选择覆盖原文件或者追加）这个的指令你们自己定吧，输入 指令 [文件名], 向当前目录下此文件内写入数据或直接覆盖数据。
 * 10.	Windows系统控制台上的其他文件操作指令大家也都可以试着写一写，这个不强求，有兴趣就写写，没兴趣就只完成上述9个也很好，拒绝内卷。
 * @author wushuang
 */
public class Controls {

    private String currentPath = "C:" + File.separator;
    public String getCurrentPath() {
        return currentPath;
    }
    public void setCurrentPath(String currentPath) {
        this.currentPath = currentPath;
    }
    public void cd(String input) {
        if(input.length()<=2){
            return;
        }
        String path = input.substring(3);
        File newDirectory;
        if (!isAllSameChar(path, '.') && !isAllSameChar(path, File.separatorChar)){
            if (path.startsWith(getCurrentPath())||path.contains(File.separator)) {
                newDirectory = new File(path);
//                Paths.get(newDirectory.getAbsolutePath()).normalize();
                //输入cd \会进入D目录
            }
            //相对路径
            else {
                newDirectory = new File(getCurrentPath() + File.separator + path);
//                Paths.get(newDirectory.getAbsolutePath()).normalize();
            }

            // 检查目标路径是否存在和是否为目录
            if (newDirectory.exists() && newDirectory.isDirectory()) {
                setCurrentPath(newDirectory.getAbsolutePath());
                System.out.println("当前目录: " + getCurrentPath());
            } else {
                System.out.println("系统找不到指定的路径。");
//            System.out.println("当前目录: " + getCurrentPath());
            }
        }else{
            System.out.println("系统找不到指定的路径。");
        }

    }
    public void cdBack(){
        File Path = new File(getCurrentPath());
        File newPath = Path.getParentFile();
        if(newPath != null){
            setCurrentPath(newPath.getPath());
//            System.out.println("此时目录："+getCurrentPath());
        }else{
            System.out.println("已经到达根目录啦");
        }
    }
    public void touch(String input){
        String fileName = input.substring(6);
        File file = new File(getCurrentPath()+File.separator+fileName);
        if(file.exists()){
            System.out.println("文件已经存在啦");
        }else{
            System.out.println("文件创建成功："+file.getAbsolutePath());
            try {
                file.createNewFile();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
    public void delete(String input) {
        // 获得要删除的路径
        String filepath = input.substring(7);
        // 获得要删除的绝对路径
        File file = new File(getCurrentPath() + File.separator + filepath);
        // 判断路径是否存在
        if (!file.exists()) {
            System.out.println("要删除的文件或目录不存在");
            return;
        }
        // 如果是文件，直接删除
        if (file.isFile()) {
            System.out.println(file.getName() + "已删除");
            file.delete();
            return;
        }
        // 如果是目录，先删除目录里的文件和子目录
        File[] subFiles = file.listFiles();
        if (subFiles != null && subFiles.length > 0) {
            for (File subFile : subFiles) {
                if (subFile.isFile()) {
                    System.out.println(subFile.getName() + "已删除");
                    subFile.delete();
                } else {
                    // 递归删除子目录
                    delete("delete " + filepath + File.separator + subFile.getName());
                }
            }
        }
        // 最后删除目录本身
        System.out.println(file.getName() + "目录已删除");
        file.delete();
    }
    public void mkdir(String input){
        if(input.length() <= 6){
            return;
        }
        String newDirName = input.substring(6);
        File newDir = new File(getCurrentPath() + File.separator + newDirName);
        if(newDir.exists()){
            System.out.println("目录已存在: " + newDirName);
        }else{
            System.out.println("已创建目录: " +newDirName);
            newDir.mkdir();
        }
    }
    public void mv(String input) {
        if (input.length() <= 3) {
            return;
        }
        String[] args = input.split(" ");

        String oldFileName = args[1];
        String target = args[2];

        Path dir;
        if(getCurrentPath().endsWith(File.separator)){
            dir = Paths.get(getCurrentPath() + oldFileName);
            System.out.println(getCurrentPath() + oldFileName);
        }
        else{
            dir = Paths.get(getCurrentPath() + File.separator + oldFileName);
            System.out.println(getCurrentPath() + File.separator + oldFileName);
        }
        //绝对路径
        Path newDir = Paths.get(target + File.separator + oldFileName);

        try {
            Files.move(dir,newDir);
            System.out.println("文件已移动到 " + target);
        } catch (IOException e) {
            System.out.println("移动文件时出现异常：" + e.getMessage());
        }
    }
    public void ls() {
        File currentDir = new File(getCurrentPath());
        File[] files = currentDir.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    System.out.println(file.getName() + "  文件");
                } else if (file.isDirectory()) {
                    System.out.println(file.getName() + "  目录");
                }
            }
        } else {
            System.out.println("当前目录为空");
        }
    }
    public void cat(String input) {
        if (input.length() <= 4) {
            return;
        }
        String fileName = input.substring(4);
        File file = new File(getCurrentPath() + File.separator + fileName);

        if(!file.exists()){
            System.out.println("这个文件不存在哦~");
        }
        else {
            //接入read
            Reader in = null;
            try {
                in = new FileReader(file);
            } catch (FileNotFoundException e) {
                System.out.println("出现未知错误：" + e.getMessage());
            }
            //接入缓冲流
            BufferedReader read = new BufferedReader(in);
                String str = null;
                try {
                    while((str = read.readLine())!=null) {
                        System.out.println(str);
                    }
                } catch (IOException e) {
                    System.out.println("出现未知错误：" + e.getMessage());
                }
            try {
                read.close();
            } catch (IOException e) {
                System.out.println("出现未知错误：" + e.getMessage());
            }
        }


    }

    public void input(String input){
        if (input.length() <= 6) {
            return;
        }
        Scanner in = new Scanner(System.in);

        String fileName = input.substring(6);
        File file = new File(getCurrentPath() + File.separator + fileName);
        if(!file.exists()){
            System.out.println("文件不存在！");
            return;
        }
        Reader fileReader = null;
        Writer fileWriter = null;
        try {
            fileReader = new FileReader(file);
        } catch (FileNotFoundException e) {
            System.out.println("出现未知错误：" + e.getMessage());
        }
        boolean isAppend = false;
        System.out.println("你是否选择追加还是覆盖呢？追加请输入Y，否则输入N");
        String str = in.nextLine();
        while(!"Y".equals(str) && !"N".equals(str)){
            System.out.println("您输入有误，请重新输入~");
            str = in.nextLine();
        }
        if("Y".equals(str)){
            isAppend = true;
            try {
                fileWriter = new FileWriter(file,isAppend);
            } catch (IOException e) {
                System.out.println("出现未知错误：" + e.getMessage());
            }finally {
                System.out.println("好的，你选择了追加");

            }
        }
        else if("N".equals(str)){
            try {
                fileWriter = new FileWriter(file,isAppend);
            } catch (IOException e) {
                System.out.println("出现未知错误：" + e.getMessage());

            }finally {
                System.out.println("好的，你选择了覆盖");
            }
        }
        System.out.println("请输入要写入文件的内容：");
        String content = in.nextLine();
        try {
            fileWriter.write(content);
        } catch (IOException e) {
            System.out.println("出现未知错误：" + e.getMessage());
        }
        try {
            fileWriter.close();
        } catch (IOException e) {
            System.out.println("出现未知错误：" + e.getMessage());
        }
        System.out.println("读入成功！");
    }
    public static boolean isAllSameChar(String str, char ch) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        for(int i = 0; i < str.length(); i++) {
            if(str.charAt(i) != ch) {
                return false;
            }
        }
        return true;
    }

}
